package com.jrauto.CarAppBackend.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.jrauto.CarAppBackend.entity.Car;
import com.jrauto.CarAppBackend.entity.dto.CarQueryDTO;
import com.jrauto.CarAppBackend.entity.vo.CarListVO;
import com.jrauto.CarAppBackend.entity.vo.CarVO;
import com.jrauto.CarAppBackend.entity.vo.MyCarListVO;

import java.util.List;

/**
* @author huimin
* @description 针对表【cars(二手车主表)】的数据库操作Service
* @createDate 2025-06-27 15:58:44
*/
/**
 * 汽车业务逻辑接口
 * 继承 IService 即可获得常见的单表操作方法
 */
public interface CarService extends IService<Car> {



    /**
     * 新增车辆信息及关联图片。
     * 前端需先将图片上传至COS，并将COS URL列表传递给后端。
     * @param car 车辆文字信息
     * @param imageUrls 图片COS URL列表
     * @return 新增的车辆对象
     */
    Car addCar(Car car, List<String> imageUrls);



    /**
     * 更新车辆信息及关联图片。
     * 前端需传递最新的完整图片URL列表（包含旧的和新上传的）。
     * 后端将根据此列表同步更新数据库和COS文件。
     * @param car 待更新的车辆对象（ID必须存在）
     * @param newImageUrls 最新的图片COS URL列表
     * @return 更新是否成功
     */
    boolean updateCar(Car car, List<String> newImageUrls);

    /**
     * 根据ID删除车辆信息及关联的COS图片。
     * @param carId 车辆ID
     * @return 删除是否成功
     */
    boolean deleteCar(Integer carId);

    /**
     * 查询所有已上架的汽车列表，包含主图
     * @return 已上架汽车列表
     */
    IPage<CarListVO> listPublishedCarsWithMainImage(int pageNum, int pageSize);


    /**
     * 查询指定发布人ID发布的已上架汽车列表，包含主图
     * @param publisherId 发布人ID
     * @return 汽车列表（包含主图URL）
     */
    List<MyCarListVO> listCarsByPublisherId(Integer publisherId);

    /**
     * 根据车辆ID查询汽车详情，包含所有相关图片
     * @param carId 车辆ID
     * @return 汽车详情，如果不存在则返回null
     */
    CarVO getCarDetailsWithMedia(Integer carId);

    /**
     * 根据标题模糊查询已上架的汽车列表，包含主图
     * @param title 标题关键字
     * @return 汽车列表
     */
    IPage<CarListVO> listPublishedCarsByTitleFuzzy(String province,
                                               String city,
                                               String district,
                                               String title,
                                               int pageNum,
                                               int pageSize);

    /**
     * 根据汽车编号查询已上架的汽车列表，包含主图
     * @param carNumber 汽车编号
     * @return 汽车列表
     */
    List<CarVO> listPublishedCarsByCarNumber(String carNumber);

    /**
     * 根据汽车品牌查询已上架的汽车列表，包含主图
     * @param brand 汽车品牌
     * @return 汽车列表
     */
    IPage<CarListVO> listPublishedCarsByBrand(String brand,int pageNum, int pageSize);

    /**
     * 根据地区（省市区）查询已上架的汽车列表，包含主图
     * @param province 省份
     * @param city 城市
     * @param district 区县
     * @return 汽车列表
     */
    List<CarVO> listPublishedCarsByRegion(String province, String city, String district);

    /**
     * 根据地区（省市区）和品牌查询已上架的汽车列表，包含主图
     * @param province 省份
     * @param city 城市
     * @param district 区县
     * @param brand 品牌
     * @return 汽车列表
     */
//    List<CarVO> listPublishedCarsByRegionAndBrand(String province, String city, String district, String brand);

    /**
     * 根据地区（省市区）和标题模糊查询已上架的汽车列表，包含主图
     * @param province 省份
     * @param city 城市
     * @param district 区县
     * @param title 标题关键字
     * @return 汽车列表
     */
//    IPage<CarListVO> listPublishedCarsByRegionAndTitleFuzzy(String province, String city, String district, String title,int pageNum,
//                                                        int pageSize);

    /**
     * 多条件查询已上架的汽车列表，包含主图
     * @param queryDTO 查询条件DTO
     * @return 汽车列表
     */
    List<CarVO> listPublishedCarsMultiCondition(CarQueryDTO queryDTO);

    /**
     * 更新汽车信息
     * @param car 待更新的汽车对象
     * @return 是否更新成功
     */
    boolean updateCar(Car car);

    /**
     * 汽车下架：将汽车状态设置为已下架(status=2)
     * @param carId 车辆ID
     * @return 是否下架成功
     */
    boolean offlineCar(Integer carId);


    /**
     * 汽车重新发布：将汽车状态设置为待审核(status=0)
     * @param carId 车辆ID
     * @return 是否发布成功
     */
    boolean publishCar(Integer carId);
}

